Tumor evolution project

Data used

In this notebook, we are using the tmb_genomic.tsv file generated from the 01-preprocess-data.Rmd script.

Set up

suppressPackageStartupMessages({
  library(tidyverse)
})

Directories and File Inputs/Outputs

# Detect the ".git" folder. This will be in the project root directory.
# Use this as the root directory to ensure proper sourcing of functions
# no matter where this is called from.
root_dir <- rprojroot::find_root(rprojroot::has_dir(".git"))
scratch_dir <- file.path(root_dir, "scratch")
analysis_dir <- file.path(root_dir, "analyses", "tmb-vaf-longitudinal") 
input_dir <- file.path(analysis_dir, "input")

# Input files
tmb_genomic_file <- file.path(scratch_dir, "tmb_genomic.tsv")
tumor_descriptor_color_palette_file <- file.path(root_dir, "figures", "palettes", "tumor_descriptor_color_palette.tsv")

# File path to plots directory
plots_dir <-
  file.path(analysis_dir, "plots")
if (!dir.exists(plots_dir)) {
  dir.create(plots_dir)
}

source(paste0(analysis_dir, "/util/function-create-barplot.R"))
source(paste0(root_dir, "/figures/scripts/theme.R"))

Read in data and process

# Read and process tmb_genomic file
tmb_genomic_all <- readr::read_tsv(tmb_genomic_file, guess_max = 100000, show_col_types = FALSE) 

# Are there any samples with both WGS and WXS? 
tmb_genomic_all %>% 
  unique() %>% 
  arrange(Kids_First_Participant_ID, experimental_strategy)  %>%
  group_by(Kids_First_Participant_ID) %>%
  dplyr::summarise(experimental_strategy_sum = str_c(experimental_strategy, collapse = ";")) 
# Create a factor to order timepoints
f <- factor(c(tmb_genomic_all$tumor_descriptor), levels = c("Diagnosis", "Progressive", "Recurrence", "Deceased", "Unavailable", "Second Malignancy"))

# Yes, they are, so let's remove these from downstream analyses.
tmb_genomic <- tmb_genomic_all %>% 
  filter(!experimental_strategy == "WXS") %>% 
  mutate(patient_id = paste(short_histology, Kids_First_Participant_ID, sep = "_"))

# Read color palette
tumor_descriptor_color_palette <- readr::read_tsv(tumor_descriptor_color_palette_file, guess_max = 100000, show_col_types = FALSE)

TMB per Patient case

We will explore TMB per Kids_First_Participant_ID over time by creating stacked barplots.

# Define parameters for function
ylim <- 360
tmb_df <- tmb_genomic

# Run function
fname <- paste0(plots_dir, "/", "TMB-genomic.pdf")
print(fname)
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic.pdf"
p <- create_stacked_barplot(tmb_df = tmb_df, ylim = ylim)
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
Warning: Removed 1 rows containing missing values (`geom_col()`).
Warning: Removed 1 rows containing missing values (`geom_bar()`).

pdf(file = fname, width = 15, height = 6)
print(p)
Warning: Removed 1 rows containing missing values (`geom_col()`).
Removed 1 rows containing missing values (`geom_bar()`).
dev.off()
png 
  2 

Attention: Hypermutant TMB defined as ≥10 Mb, and Ultrahypermutant TMB defined as ≥100 mutations/Mb (https://pubmed.ncbi.nlm.nih.gov/29056344/).

Here, we notice that there are samples with high TMB (hyper-mutant samples). Next, we will exclude these samples (threshold >= 10) from downstream analysis. Attention is needed in cases with high number of mutations in only one timepoint as this will lead to un-matched longitudinal samples. We will also remove those so we always have matched longitudinal samples.

# Filter df
tmb_genomic_filter <- tmb_genomic %>%
  filter(!tmb >= 10)  %>%
  unique() %>% 
  arrange(Kids_First_Participant_ID, tumor_descriptor) %>%
  group_by(Kids_First_Participant_ID) %>%
  dplyr::summarise(tumor_descriptor_sum = str_c(tumor_descriptor, collapse = ";")) %>% 
  filter(!tumor_descriptor_sum %in% c("Diagnosis", "Progressive", "Recurrence")) %>% 
  dplyr::left_join(tmb_genomic, by = c("Kids_First_Participant_ID", "tumor_descriptor_sum")) %>% 
  mutate(cancer_group_sum = ifelse(short_histology == "HGAT", "High-grade glioma",
                                   ifelse(short_histology == "LGAT", "Low-grade glioma", "Other cancer group")),
         cancer_group_sum = replace_na(cancer_group_sum, "Other")) %>% 
  drop_na(tmb) 


# Define parameters for function
ylim <- 12.5
tmb_df <- tmb_genomic_filter

# Run function
fname <- paste0(plots_dir, "/", "TMB-genomic-no-hypermutants.pdf")
print(fname)
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic-no-hypermutants.pdf"
p <- create_stacked_barplot(tmb_df = tmb_df, ylim = ylim)

pdf(file = fname, width = 25, height = 8)
print(p)
dev.off()
png 
  2 

TMB across timepoints and cancer types per Patient case

We will explore TMB per cancer group over time by creating dumbbell plots. We classified by using cancer types with the highest number of samples (High- and Low-grade gliomas) versus any other cancer groups.

cancer_groups <- unique(as.character(tmb_genomic_filter$cancer_group_sum))
cancer_groups <- sort(cancer_groups, decreasing = FALSE)
print(cancer_groups)
[1] "High-grade glioma"  "Low-grade glioma"   "Other cancer group"
for (i in seq_along(cancer_groups)) {
  print(i)
  df_ct_sub <- tmb_genomic_filter %>% 
    filter(cancer_group_sum == cancer_groups [i])
  
  if (i == 1) {
    print(cancer_groups [i])
    # Define parameters for function
    ylim <- 8
    } else if (i == 2) {
      print(cancer_groups [i])
      # Define parameters for function
      ylim <- 4
      } else {
        print(cancer_groups [i])
        # Define parameters for function
        ylim <- 4
      }
    
    # Name plots
    fname <- paste0(plots_dir, "/", "TMB-genomic-dumbbell", "-", cancer_groups[i], ".pdf")
    print(fname)
    
    # Run function
    p <- create_dumbbell_ct(tmb_df = df_ct_sub, 
                                 ylim = ylim, 
                                 ct_id = cancer_groups[i])
    pdf(file = fname, width = 18, height = 10)
    print(p)
    dev.off()
}
[1] 1
[1] "High-grade glioma"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic-dumbbell-High-grade glioma.pdf"

[1] 2
[1] "Low-grade glioma"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic-dumbbell-Low-grade glioma.pdf"

[1] 3
[1] "Other cancer group"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic-dumbbell-Other cancer group.pdf"

Total number of mutations across timepoints and cancer types per Patient case

for (i in seq_along(cancer_groups)) {
  print(i)
  df_ct_sub <- tmb_genomic_filter %>% 
    filter(cancer_group_sum == cancer_groups [i])
  
  if (i == 1) {
    print(cancer_groups [i])
    # Define parameters for function
    ylim <- 260
    } else if (i == 2) {
      print(cancer_groups [i])
      # Define parameters for function
      ylim <- 150
      } else {
        print(cancer_groups [i])
        # Define parameters for function
        ylim <- 150
      }
    
    # Name plots
    fname <- paste0(plots_dir, "/", "Mutations-genomic-dumbbell", "-", cancer_groups[i], ".pdf")
    print(fname)
    
    # Run function
    p <- create_dumbbell_ct_mut(tmb_df = df_ct_sub, 
                                 ylim = ylim, 
                                 ct_id = cancer_groups[i])
    pdf(file = fname, width = 18, height = 10)
    print(p)
    dev.off()
}
[1] 1
[1] "High-grade glioma"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Mutations-genomic-dumbbell-High-grade glioma.pdf"

[1] 2
[1] "Low-grade glioma"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Mutations-genomic-dumbbell-Low-grade glioma.pdf"

[1] 3
[1] "Other cancer group"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Mutations-genomic-dumbbell-Other cancer group.pdf"

Total number of mutations across timepoints and biospecimen sample per Patient case

Here, we want to explore the number of mutations per timepoint and biospecimen sample per patient case.

samples <- unique(as.character(tmb_genomic_filter$Kids_First_Participant_ID))
print(samples)
 [1] "PT_00G007DM" "PT_02J5CWN5" "PT_1H2REHT2" "PT_1ZAWNGWT" "PT_25Z2NX27"
 [6] "PT_2ECVKTTQ" "PT_2FVTD0WR" "PT_2YT37G8P" "PT_37B5JRP1" "PT_3R0P995B"
[11] "PT_3T3VGWC6" "PT_3VCS1PPF" "PT_7M2PGCBV" "PT_82MX6J77" "PT_89XRZBSG"
[16] "PT_8GN3TQRM" "PT_962TCBVR" "PT_98QMQZY7" "PT_99S5BPE3" "PT_9PJR0ZK7"
[21] "PT_9S6WMQ92" "PT_AQWDQW27" "PT_CXT81GRM" "PT_DFQAH7RS" "PT_ESHACWF6"
[26] "PT_FN4GEEFR" "PT_HFQNKP5X" "PT_HJMP6PH2" "PT_JNEV57VK" "PT_JP1FDKN9"
[31] "PT_JSFBMK5V" "PT_K8ZV7APT" "PT_KMHGNCNR" "PT_MDWPRDBT" "PT_MNSEJCDM"
[36] "PT_N8W26H19" "PT_NPETR8RY" "PT_PFA762TK" "PT_PR4YBBH3" "PT_QH9H491G"
[41] "PT_RJ1TJ2KH" "PT_S2SQJVGK" "PT_S4YNE17X" "PT_T2M1338J" "PT_TKWTTRQ7"
[46] "PT_W6AWJJK7" "PT_WP871F5S" "PT_XA98HG1C" "PT_XHYBZKCX" "PT_XTVQB9S4"
[51] "PT_YGN06RPZ" "PT_Z4GS3ZQQ" "PT_ZMKMKCFQ" "PT_ZZRBX5JT"
for (i in seq_along(samples)) {
  print(i)
  tmb_sub <- tmb_genomic_filter %>%
    filter(Kids_First_Participant_ID == samples[i])
  
  if (i %in% c(42, 37, 16, 1, 38, 52)) { # "PT_9S6WMQ92", "PT_ESHACWF6", "PT_JNEV57VK", "PT_TKWTTRQ7",  "PT_N8W26H19", "PT_2YT37G8P"
    print(samples[i])
    # Define parameters for function
    ylim <- 260
    } else if (i %in% c(27, 31, 30, 6, 38, 28,  15, 49, 47, 46, 50, 54)) { 
      print(samples[i])
      # Define parameters for function
      ylim <- 100 # "PT_37B5JRP1", "PT_CXT81GRM", "PT_JSFBMK5V", "PT_XA98HG1C", "PT_N8W26H19",  "PT_89XRZBSG","PT_99S5BPE3", "PT_8GN3TQRM", "PT_HFQNKP5X", "PT_MDWPRDBT",  "PT_9PJR0ZK7", "PT_1H2REHT2"
      } else {
        print(samples[i])
        # Define parameters for function
        ylim <- 50
      } 
 
  # Run function
  fname <- paste0(plots_dir, "/", samples[i], "-TMB-barplot.pdf")
  print(fname)
  p <- create_barplot_sample(tmb_df = tmb_sub,
                             ylim = ylim,
                             sid = samples[i])
  pdf(file = fname, width = 5, height = 4)
  print(p)
  dev.off()
}
[1] 1
[1] "PT_00G007DM"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_00G007DM-TMB-barplot.pdf"

[1] 2
[1] "PT_02J5CWN5"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_02J5CWN5-TMB-barplot.pdf"

[1] 3
[1] "PT_1H2REHT2"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_1H2REHT2-TMB-barplot.pdf"
Warning: Removed 2 rows containing missing values (`position_stack()`).
Removed 2 rows containing missing values (`position_stack()`).
Removed 2 rows containing missing values (`position_stack()`).
Removed 2 rows containing missing values (`position_stack()`).

[1] 4
[1] "PT_1ZAWNGWT"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_1ZAWNGWT-TMB-barplot.pdf"

[1] 5
[1] "PT_25Z2NX27"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_25Z2NX27-TMB-barplot.pdf"

[1] 6
[1] "PT_2ECVKTTQ"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_2ECVKTTQ-TMB-barplot.pdf"

[1] 7
[1] "PT_2FVTD0WR"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_2FVTD0WR-TMB-barplot.pdf"

[1] 8
[1] "PT_2YT37G8P"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_2YT37G8P-TMB-barplot.pdf"
Warning: Removed 1 rows containing missing values (`position_stack()`).
Warning: Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).

[1] 9
[1] "PT_37B5JRP1"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_37B5JRP1-TMB-barplot.pdf"
Warning: Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).

[1] 10
[1] "PT_3R0P995B"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3R0P995B-TMB-barplot.pdf"

[1] 11
[1] "PT_3T3VGWC6"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3T3VGWC6-TMB-barplot.pdf"

[1] 12
[1] "PT_3VCS1PPF"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3VCS1PPF-TMB-barplot.pdf"

[1] 13
[1] "PT_7M2PGCBV"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_7M2PGCBV-TMB-barplot.pdf"

[1] 14
[1] "PT_82MX6J77"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_82MX6J77-TMB-barplot.pdf"

[1] 15
[1] "PT_89XRZBSG"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_89XRZBSG-TMB-barplot.pdf"

[1] 16
[1] "PT_8GN3TQRM"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_8GN3TQRM-TMB-barplot.pdf"

[1] 17
[1] "PT_962TCBVR"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_962TCBVR-TMB-barplot.pdf"

[1] 18
[1] "PT_98QMQZY7"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_98QMQZY7-TMB-barplot.pdf"

[1] 19
[1] "PT_99S5BPE3"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_99S5BPE3-TMB-barplot.pdf"
Warning: Removed 2 rows containing missing values (`position_stack()`).
Warning: Removed 2 rows containing missing values (`position_stack()`).
Removed 2 rows containing missing values (`position_stack()`).
Removed 2 rows containing missing values (`position_stack()`).

[1] 20
[1] "PT_9PJR0ZK7"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_9PJR0ZK7-TMB-barplot.pdf"
Warning: Removed 1 rows containing missing values (`position_stack()`).
Warning: Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).

[1] 21
[1] "PT_9S6WMQ92"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_9S6WMQ92-TMB-barplot.pdf"
Warning: Removed 3 rows containing missing values (`position_stack()`).
Warning: Removed 3 rows containing missing values (`position_stack()`).
Removed 3 rows containing missing values (`position_stack()`).
Removed 3 rows containing missing values (`position_stack()`).

[1] 22
[1] "PT_AQWDQW27"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_AQWDQW27-TMB-barplot.pdf"

[1] 23
[1] "PT_CXT81GRM"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_CXT81GRM-TMB-barplot.pdf"
Warning: Removed 1 rows containing missing values (`position_stack()`).
Warning: Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).

[1] 24
[1] "PT_DFQAH7RS"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_DFQAH7RS-TMB-barplot.pdf"

[1] 25
[1] "PT_ESHACWF6"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_ESHACWF6-TMB-barplot.pdf"
Warning: Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).

[1] 26
[1] "PT_FN4GEEFR"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_FN4GEEFR-TMB-barplot.pdf"

[1] 27
[1] "PT_HFQNKP5X"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_HFQNKP5X-TMB-barplot.pdf"

[1] 28
[1] "PT_HJMP6PH2"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_HJMP6PH2-TMB-barplot.pdf"

[1] 29
[1] "PT_JNEV57VK"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_JNEV57VK-TMB-barplot.pdf"
Warning: Removed 2 rows containing missing values (`position_stack()`).
Warning: Removed 2 rows containing missing values (`position_stack()`).
Removed 2 rows containing missing values (`position_stack()`).
Removed 2 rows containing missing values (`position_stack()`).

[1] 30
[1] "PT_JP1FDKN9"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_JP1FDKN9-TMB-barplot.pdf"

[1] 31
[1] "PT_JSFBMK5V"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_JSFBMK5V-TMB-barplot.pdf"

[1] 32
[1] "PT_K8ZV7APT"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_K8ZV7APT-TMB-barplot.pdf"

[1] 33
[1] "PT_KMHGNCNR"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KMHGNCNR-TMB-barplot.pdf"

[1] 34
[1] "PT_MDWPRDBT"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_MDWPRDBT-TMB-barplot.pdf"
Warning: Removed 2 rows containing missing values (`position_stack()`).
Removed 2 rows containing missing values (`position_stack()`).
Removed 2 rows containing missing values (`position_stack()`).
Removed 2 rows containing missing values (`position_stack()`).

[1] 35
[1] "PT_MNSEJCDM"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_MNSEJCDM-TMB-barplot.pdf"

[1] 36
[1] "PT_N8W26H19"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_N8W26H19-TMB-barplot.pdf"
Warning: Removed 1 rows containing missing values (`position_stack()`).
Warning: Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).

[1] 37
[1] "PT_NPETR8RY"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_NPETR8RY-TMB-barplot.pdf"

[1] 38
[1] "PT_PFA762TK"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_PFA762TK-TMB-barplot.pdf"

[1] 39
[1] "PT_PR4YBBH3"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_PR4YBBH3-TMB-barplot.pdf"

[1] 40
[1] "PT_QH9H491G"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_QH9H491G-TMB-barplot.pdf"

[1] 41
[1] "PT_RJ1TJ2KH"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_RJ1TJ2KH-TMB-barplot.pdf"

[1] 42
[1] "PT_S2SQJVGK"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_S2SQJVGK-TMB-barplot.pdf"

[1] 43
[1] "PT_S4YNE17X"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_S4YNE17X-TMB-barplot.pdf"

[1] 44
[1] "PT_T2M1338J"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_T2M1338J-TMB-barplot.pdf"

[1] 45
[1] "PT_TKWTTRQ7"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_TKWTTRQ7-TMB-barplot.pdf"
Warning: Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).

[1] 46
[1] "PT_W6AWJJK7"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_W6AWJJK7-TMB-barplot.pdf"

[1] 47
[1] "PT_WP871F5S"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_WP871F5S-TMB-barplot.pdf"

[1] 48
[1] "PT_XA98HG1C"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_XA98HG1C-TMB-barplot.pdf"
Warning: Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).
Removed 1 rows containing missing values (`position_stack()`).

[1] 49
[1] "PT_XHYBZKCX"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_XHYBZKCX-TMB-barplot.pdf"

[1] 50
[1] "PT_XTVQB9S4"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_XTVQB9S4-TMB-barplot.pdf"

[1] 51
[1] "PT_YGN06RPZ"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_YGN06RPZ-TMB-barplot.pdf"

[1] 52
[1] "PT_Z4GS3ZQQ"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_Z4GS3ZQQ-TMB-barplot.pdf"

[1] 53
[1] "PT_ZMKMKCFQ"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_ZMKMKCFQ-TMB-barplot.pdf"

[1] 54
[1] "PT_ZZRBX5JT"
[1] "/home/rstudio/pbta-tumor-evolution/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_ZZRBX5JT-TMB-barplot.pdf"

sessionInfo()
R version 4.2.3 (2023-03-15)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 22.04.2 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
 [1] ggthemes_4.2.4  lubridate_1.9.2 forcats_1.0.0   stringr_1.5.0  
 [5] dplyr_1.1.1     purrr_1.0.1     readr_2.1.4     tidyr_1.3.0    
 [9] tibble_3.2.1    ggplot2_3.4.0   tidyverse_2.0.0

loaded via a namespace (and not attached):
 [1] highr_0.10       bslib_0.4.2      compiler_4.2.3   pillar_1.9.0    
 [5] jquerylib_0.1.4  tools_4.2.3      bit_4.0.5        digest_0.6.31   
 [9] timechange_0.2.0 jsonlite_1.8.4   evaluate_0.20    lifecycle_1.0.3 
[13] gtable_0.3.3     pkgconfig_2.0.3  rlang_1.1.0      cli_3.6.1       
[17] parallel_4.2.3   yaml_2.3.7       xfun_0.38        fastmap_1.1.1   
[21] withr_2.5.0      knitr_1.42       generics_0.1.3   vctrs_0.6.2     
[25] sass_0.4.5       hms_1.1.3        bit64_4.0.5      rprojroot_2.0.3 
[29] tidyselect_1.2.0 glue_1.6.2       R6_2.5.1         fansi_1.0.4     
[33] vroom_1.6.1      rmarkdown_2.21   farver_2.1.1     tzdb_0.3.0      
[37] magrittr_2.0.3   scales_1.2.1     htmltools_0.5.5  colorspace_2.1-0
[41] labeling_0.4.2   utf8_1.2.3       stringi_1.7.12   munsell_0.5.0   
[45] cachem_1.0.7     crayon_1.5.2    
LS0tCnRpdGxlOiAiQ3JlYXRlIFRNQiBiYXJwbG90cyBvZiB0dW1vcnMgYWNyb3NzIG11bHRpcGxlIHRpbWVwb2ludHMgb2YgdGhlIFBCVEEgQ29ob3J0IgphdXRob3I6ICJBbnRvbmlhIENocm9uaSA8Y2hyb25pYUBjaG9wLmVkdT4gZm9yIEQzQiIKZGF0ZTogIjIwMjMiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKLS0tCgojIyMjIFR1bW9yIGV2b2x1dGlvbiBwcm9qZWN0IAoKIyMjIERhdGEgdXNlZCAKSW4gdGhpcyBub3RlYm9vaywgd2UgYXJlIHVzaW5nIHRoZSBgdG1iX2dlbm9taWMudHN2YCBmaWxlIGdlbmVyYXRlZCBmcm9tIHRoZSBgMDEtcHJlcHJvY2Vzcy1kYXRhLlJtZGAgc2NyaXB0LgoKIyBTZXQgdXAKYGBge3IgbG9hZC1saWJyYXJ5fQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewogIGxpYnJhcnkodGlkeXZlcnNlKQp9KQpgYGAKCiMgRGlyZWN0b3JpZXMgYW5kIEZpbGUgSW5wdXRzL091dHB1dHMKYGBge3Igc2V0LWRpci1hbmQtZmlsZS1uYW1lc30KIyBEZXRlY3QgdGhlICIuZ2l0IiBmb2xkZXIuIFRoaXMgd2lsbCBiZSBpbiB0aGUgcHJvamVjdCByb290IGRpcmVjdG9yeS4KIyBVc2UgdGhpcyBhcyB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gZW5zdXJlIHByb3BlciBzb3VyY2luZyBvZiBmdW5jdGlvbnMKIyBubyBtYXR0ZXIgd2hlcmUgdGhpcyBpcyBjYWxsZWQgZnJvbS4Kcm9vdF9kaXIgPC0gcnByb2pyb290OjpmaW5kX3Jvb3QocnByb2pyb290OjpoYXNfZGlyKCIuZ2l0IikpCnNjcmF0Y2hfZGlyIDwtIGZpbGUucGF0aChyb290X2RpciwgInNjcmF0Y2giKQphbmFseXNpc19kaXIgPC0gZmlsZS5wYXRoKHJvb3RfZGlyLCAiYW5hbHlzZXMiLCAidG1iLXZhZi1sb25naXR1ZGluYWwiKSAKaW5wdXRfZGlyIDwtIGZpbGUucGF0aChhbmFseXNpc19kaXIsICJpbnB1dCIpCgojIElucHV0IGZpbGVzCnRtYl9nZW5vbWljX2ZpbGUgPC0gZmlsZS5wYXRoKHNjcmF0Y2hfZGlyLCAidG1iX2dlbm9taWMudHN2IikKdHVtb3JfZGVzY3JpcHRvcl9jb2xvcl9wYWxldHRlX2ZpbGUgPC0gZmlsZS5wYXRoKHJvb3RfZGlyLCAiZmlndXJlcyIsICJwYWxldHRlcyIsICJ0dW1vcl9kZXNjcmlwdG9yX2NvbG9yX3BhbGV0dGUudHN2IikKCiMgRmlsZSBwYXRoIHRvIHBsb3RzIGRpcmVjdG9yeQpwbG90c19kaXIgPC0KICBmaWxlLnBhdGgoYW5hbHlzaXNfZGlyLCAicGxvdHMiKQppZiAoIWRpci5leGlzdHMocGxvdHNfZGlyKSkgewogIGRpci5jcmVhdGUocGxvdHNfZGlyKQp9Cgpzb3VyY2UocGFzdGUwKGFuYWx5c2lzX2RpciwgIi91dGlsL2Z1bmN0aW9uLWNyZWF0ZS1iYXJwbG90LlIiKSkKc291cmNlKHBhc3RlMChyb290X2RpciwgIi9maWd1cmVzL3NjcmlwdHMvdGhlbWUuUiIpKQpgYGAKCiMgUmVhZCBpbiBkYXRhIGFuZCBwcm9jZXNzCmBgYHtyIHJlYWRfaW5wdXRfZmlsZXN9CiMgUmVhZCBhbmQgcHJvY2VzcyB0bWJfZ2Vub21pYyBmaWxlCnRtYl9nZW5vbWljX2FsbCA8LSByZWFkcjo6cmVhZF90c3YodG1iX2dlbm9taWNfZmlsZSwgZ3Vlc3NfbWF4ID0gMTAwMDAwLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKSAKCiMgQXJlIHRoZXJlIGFueSBzYW1wbGVzIHdpdGggYm90aCBXR1MgYW5kIFdYUz8gCnRtYl9nZW5vbWljX2FsbCAlPiUgCiAgdW5pcXVlKCkgJT4lIAogIGFycmFuZ2UoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCwgZXhwZXJpbWVudGFsX3N0cmF0ZWd5KSAgJT4lCiAgZ3JvdXBfYnkoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShleHBlcmltZW50YWxfc3RyYXRlZ3lfc3VtID0gc3RyX2MoZXhwZXJpbWVudGFsX3N0cmF0ZWd5LCBjb2xsYXBzZSA9ICI7IikpIAoKIyBDcmVhdGUgYSBmYWN0b3IgdG8gb3JkZXIgdGltZXBvaW50cwpmIDwtIGZhY3RvcihjKHRtYl9nZW5vbWljX2FsbCR0dW1vcl9kZXNjcmlwdG9yKSwgbGV2ZWxzID0gYygiRGlhZ25vc2lzIiwgIlByb2dyZXNzaXZlIiwgIlJlY3VycmVuY2UiLCAiRGVjZWFzZWQiLCAiVW5hdmFpbGFibGUiLCAiU2Vjb25kIE1hbGlnbmFuY3kiKSkKCiMgWWVzLCB0aGV5IGFyZSwgc28gbGV0J3MgcmVtb3ZlIHRoZXNlIGZyb20gZG93bnN0cmVhbSBhbmFseXNlcy4KdG1iX2dlbm9taWMgPC0gdG1iX2dlbm9taWNfYWxsICU+JSAKICBmaWx0ZXIoIWV4cGVyaW1lbnRhbF9zdHJhdGVneSA9PSAiV1hTIikgJT4lIAogIG11dGF0ZShwYXRpZW50X2lkID0gcGFzdGUoc2hvcnRfaGlzdG9sb2d5LCBLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lELCBzZXAgPSAiXyIpKQoKIyBSZWFkIGNvbG9yIHBhbGV0dGUKdHVtb3JfZGVzY3JpcHRvcl9jb2xvcl9wYWxldHRlIDwtIHJlYWRyOjpyZWFkX3Rzdih0dW1vcl9kZXNjcmlwdG9yX2NvbG9yX3BhbGV0dGVfZmlsZSwgZ3Vlc3NfbWF4ID0gMTAwMDAwLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQpgYGAKCiMgVE1CIHBlciBQYXRpZW50IGNhc2UKV2Ugd2lsbCBleHBsb3JlIFRNQiBwZXIgYEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSURgIG92ZXIgdGltZSBieSBjcmVhdGluZyBzdGFja2VkIGJhcnBsb3RzLgoKYGBge3IgY3JlYXRlLXN0YWNrZWQtYmFycGxvdCwgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQgPSA2LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0KIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KeWxpbSA8LSAzNjAKdG1iX2RmIDwtIHRtYl9nZW5vbWljCgojIFJ1biBmdW5jdGlvbgpmbmFtZSA8LSBwYXN0ZTAocGxvdHNfZGlyLCAiLyIsICJUTUItZ2Vub21pYy5wZGYiKQpwcmludChmbmFtZSkKcCA8LSBjcmVhdGVfc3RhY2tlZF9iYXJwbG90KHRtYl9kZiA9IHRtYl9kZiwgeWxpbSA9IHlsaW0pCnBkZihmaWxlID0gZm5hbWUsIHdpZHRoID0gMTUsIGhlaWdodCA9IDYpCnByaW50KHApCmRldi5vZmYoKQpgYGAKQXR0ZW50aW9uOiBIeXBlcm11dGFudCBUTUIgZGVmaW5lZCBhcyDiiaUxMCBNYiwgYW5kIFVsdHJhaHlwZXJtdXRhbnQgVE1CIGRlZmluZWQgYXMg4omlMTAwIG11dGF0aW9ucy9NYiAoaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8yOTA1NjM0NC8pLgoKSGVyZSwgd2Ugbm90aWNlIHRoYXQgdGhlcmUgYXJlIHNhbXBsZXMgd2l0aCBoaWdoIFRNQiAoaHlwZXItbXV0YW50IHNhbXBsZXMpLiBOZXh0LCB3ZSB3aWxsIGV4Y2x1ZGUgdGhlc2Ugc2FtcGxlcyAodGhyZXNob2xkID49IDEwKSBmcm9tIGRvd25zdHJlYW0gYW5hbHlzaXMuIEF0dGVudGlvbiBpcyBuZWVkZWQgaW4gY2FzZXMgd2l0aCBoaWdoIG51bWJlciBvZiBtdXRhdGlvbnMgaW4gb25seSBvbmUgdGltZXBvaW50IGFzIHRoaXMgd2lsbCBsZWFkIHRvIHVuLW1hdGNoZWQgbG9uZ2l0dWRpbmFsIHNhbXBsZXMuIFdlIHdpbGwgYWxzbyByZW1vdmUgdGhvc2Ugc28gd2UgYWx3YXlzIGhhdmUgbWF0Y2hlZCBsb25naXR1ZGluYWwgc2FtcGxlcy4KCmBgYHtyIGNyZWF0ZS1zdGFja2VkLWJhcnBsb3QtZmlsdGVyLCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodCA9IDgsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQojIEZpbHRlciBkZgp0bWJfZ2Vub21pY19maWx0ZXIgPC0gdG1iX2dlbm9taWMgJT4lCiAgZmlsdGVyKCF0bWIgPj0gMTApICAlPiUKICB1bmlxdWUoKSAlPiUgCiAgYXJyYW5nZShLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lELCB0dW1vcl9kZXNjcmlwdG9yKSAlPiUKICBncm91cF9ieShLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKHR1bW9yX2Rlc2NyaXB0b3Jfc3VtID0gc3RyX2ModHVtb3JfZGVzY3JpcHRvciwgY29sbGFwc2UgPSAiOyIpKSAlPiUgCiAgZmlsdGVyKCF0dW1vcl9kZXNjcmlwdG9yX3N1bSAlaW4lIGMoIkRpYWdub3NpcyIsICJQcm9ncmVzc2l2ZSIsICJSZWN1cnJlbmNlIikpICU+JSAKICBkcGx5cjo6bGVmdF9qb2luKHRtYl9nZW5vbWljLCBieSA9IGMoIktpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQiLCAidHVtb3JfZGVzY3JpcHRvcl9zdW0iKSkgJT4lIAogIG11dGF0ZShjYW5jZXJfZ3JvdXBfc3VtID0gaWZlbHNlKHNob3J0X2hpc3RvbG9neSA9PSAiSEdBVCIsICJIaWdoLWdyYWRlIGdsaW9tYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNob3J0X2hpc3RvbG9neSA9PSAiTEdBVCIsICJMb3ctZ3JhZGUgZ2xpb21hIiwgIk90aGVyIGNhbmNlciBncm91cCIpKSwKICAgICAgICAgY2FuY2VyX2dyb3VwX3N1bSA9IHJlcGxhY2VfbmEoY2FuY2VyX2dyb3VwX3N1bSwgIk90aGVyIikpICU+JSAKICBkcm9wX25hKHRtYikgCgoKIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KeWxpbSA8LSAxMi41CnRtYl9kZiA8LSB0bWJfZ2Vub21pY19maWx0ZXIKCiMgUnVuIGZ1bmN0aW9uCmZuYW1lIDwtIHBhc3RlMChwbG90c19kaXIsICIvIiwgIlRNQi1nZW5vbWljLW5vLWh5cGVybXV0YW50cy5wZGYiKQpwcmludChmbmFtZSkKcCA8LSBjcmVhdGVfc3RhY2tlZF9iYXJwbG90KHRtYl9kZiA9IHRtYl9kZiwgeWxpbSA9IHlsaW0pCnBkZihmaWxlID0gZm5hbWUsIHdpZHRoID0gMjUsIGhlaWdodCA9IDgpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMgVE1CIGFjcm9zcyB0aW1lcG9pbnRzIGFuZCBjYW5jZXIgdHlwZXMgcGVyIFBhdGllbnQgY2FzZQpXZSB3aWxsIGV4cGxvcmUgVE1CIHBlciBjYW5jZXIgZ3JvdXAgb3ZlciB0aW1lIGJ5IGNyZWF0aW5nIGR1bWJiZWxsIHBsb3RzLiBXZSBjbGFzc2lmaWVkIGJ5IHVzaW5nIGNhbmNlciB0eXBlcyB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiBzYW1wbGVzIChIaWdoLSBhbmQgTG93LWdyYWRlIGdsaW9tYXMpIHZlcnN1cyBhbnkgb3RoZXIgY2FuY2VyIGdyb3Vwcy4KCmBgYHtyIGNyZWF0ZS1kdW1iYmVsbC1jdCwgZmlnLndpZHRoID0gMTgsIGZpZy5oZWlnaHQgPSAxMCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9CmNhbmNlcl9ncm91cHMgPC0gdW5pcXVlKGFzLmNoYXJhY3Rlcih0bWJfZ2Vub21pY19maWx0ZXIkY2FuY2VyX2dyb3VwX3N1bSkpCmNhbmNlcl9ncm91cHMgPC0gc29ydChjYW5jZXJfZ3JvdXBzLCBkZWNyZWFzaW5nID0gRkFMU0UpCnByaW50KGNhbmNlcl9ncm91cHMpCgpmb3IgKGkgaW4gc2VxX2Fsb25nKGNhbmNlcl9ncm91cHMpKSB7CiAgcHJpbnQoaSkKICBkZl9jdF9zdWIgPC0gdG1iX2dlbm9taWNfZmlsdGVyICU+JSAKICAgIGZpbHRlcihjYW5jZXJfZ3JvdXBfc3VtID09IGNhbmNlcl9ncm91cHMgW2ldKQogIAogIGlmIChpID09IDEpIHsKICAgIHByaW50KGNhbmNlcl9ncm91cHMgW2ldKQogICAgIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KICAgIHlsaW0gPC0gOAogICAgfSBlbHNlIGlmIChpID09IDIpIHsKICAgICAgcHJpbnQoY2FuY2VyX2dyb3VwcyBbaV0pCiAgICAgICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgICAgIHlsaW0gPC0gNAogICAgICB9IGVsc2UgewogICAgICAgIHByaW50KGNhbmNlcl9ncm91cHMgW2ldKQogICAgICAgICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgICAgICAgeWxpbSA8LSA0CiAgICAgIH0KICAgIAogICAgIyBOYW1lIHBsb3RzCiAgICBmbmFtZSA8LSBwYXN0ZTAocGxvdHNfZGlyLCAiLyIsICJUTUItZ2Vub21pYy1kdW1iYmVsbCIsICItIiwgY2FuY2VyX2dyb3Vwc1tpXSwgIi5wZGYiKQogICAgcHJpbnQoZm5hbWUpCiAgICAKICAgICMgUnVuIGZ1bmN0aW9uCiAgICBwIDwtIGNyZWF0ZV9kdW1iYmVsbF9jdCh0bWJfZGYgPSBkZl9jdF9zdWIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bGltID0geWxpbSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0X2lkID0gY2FuY2VyX2dyb3Vwc1tpXSkKICAgIHBkZihmaWxlID0gZm5hbWUsIHdpZHRoID0gMTgsIGhlaWdodCA9IDEwKQogICAgcHJpbnQocCkKICAgIGRldi5vZmYoKQp9CmBgYAoKIyBUb3RhbCBudW1iZXIgb2YgbXV0YXRpb25zIGFjcm9zcyB0aW1lcG9pbnRzIGFuZCBjYW5jZXIgdHlwZXMgcGVyIFBhdGllbnQgY2FzZQoKYGBge3IgY3JlYXRlLWR1bWJiZWxsLWN0LW11dCwgZmlnLndpZHRoID0gMTgsIGZpZy5oZWlnaHQgPSAxMCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9CmZvciAoaSBpbiBzZXFfYWxvbmcoY2FuY2VyX2dyb3VwcykpIHsKICBwcmludChpKQogIGRmX2N0X3N1YiA8LSB0bWJfZ2Vub21pY19maWx0ZXIgJT4lIAogICAgZmlsdGVyKGNhbmNlcl9ncm91cF9zdW0gPT0gY2FuY2VyX2dyb3VwcyBbaV0pCiAgCiAgaWYgKGkgPT0gMSkgewogICAgcHJpbnQoY2FuY2VyX2dyb3VwcyBbaV0pCiAgICAjIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgogICAgeWxpbSA8LSAyNjAKICAgIH0gZWxzZSBpZiAoaSA9PSAyKSB7CiAgICAgIHByaW50KGNhbmNlcl9ncm91cHMgW2ldKQogICAgICAjIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgogICAgICB5bGltIDwtIDE1MAogICAgICB9IGVsc2UgewogICAgICAgIHByaW50KGNhbmNlcl9ncm91cHMgW2ldKQogICAgICAgICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgICAgICAgeWxpbSA8LSAxNTAKICAgICAgfQogICAgCiAgICAjIE5hbWUgcGxvdHMKICAgIGZuYW1lIDwtIHBhc3RlMChwbG90c19kaXIsICIvIiwgIk11dGF0aW9ucy1nZW5vbWljLWR1bWJiZWxsIiwgIi0iLCBjYW5jZXJfZ3JvdXBzW2ldLCAiLnBkZiIpCiAgICBwcmludChmbmFtZSkKICAgIAogICAgIyBSdW4gZnVuY3Rpb24KICAgIHAgPC0gY3JlYXRlX2R1bWJiZWxsX2N0X211dCh0bWJfZGYgPSBkZl9jdF9zdWIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bGltID0geWxpbSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0X2lkID0gY2FuY2VyX2dyb3Vwc1tpXSkKICAgIHBkZihmaWxlID0gZm5hbWUsIHdpZHRoID0gMTgsIGhlaWdodCA9IDEwKQogICAgcHJpbnQocCkKICAgIGRldi5vZmYoKQp9CmBgYAoKIyBUb3RhbCBudW1iZXIgb2YgbXV0YXRpb25zIGFjcm9zcyB0aW1lcG9pbnRzIGFuZCBiaW9zcGVjaW1lbiBzYW1wbGUgcGVyIFBhdGllbnQgY2FzZQpIZXJlLCB3ZSB3YW50IHRvIGV4cGxvcmUgdGhlIG51bWJlciBvZiBtdXRhdGlvbnMgcGVyIHRpbWVwb2ludCBhbmQgYmlvc3BlY2ltZW4gc2FtcGxlIHBlciBwYXRpZW50IGNhc2UuCgpgYGB7ciBjcmVhdGUtYmFycGxvdC1zYW1wbGUsIGZpZy53aWR0aCA9IDUsIGZpZy5oZWlnaHQgPSA0LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0Kc2FtcGxlcyA8LSB1bmlxdWUoYXMuY2hhcmFjdGVyKHRtYl9nZW5vbWljX2ZpbHRlciRLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEKSkKcHJpbnQoc2FtcGxlcykKCmZvciAoaSBpbiBzZXFfYWxvbmcoc2FtcGxlcykpIHsKICBwcmludChpKQogIHRtYl9zdWIgPC0gdG1iX2dlbm9taWNfZmlsdGVyICU+JQogICAgZmlsdGVyKEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQgPT0gc2FtcGxlc1tpXSkKICAKICBpZiAoaSAlaW4lIGMoNDIsIDM3LCAxNiwgMSwgMzgsIDUyKSkgeyAjICJQVF85UzZXTVE5MiIsICJQVF9FU0hBQ1dGNiIsICJQVF9KTkVWNTdWSyIsICJQVF9US1dUVFJRNyIsICAiUFRfTjhXMjZIMTkiLCAiUFRfMllUMzdHOFAiCiAgICBwcmludChzYW1wbGVzW2ldKQogICAgIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KICAgIHlsaW0gPC0gMjYwCiAgICB9IGVsc2UgaWYgKGkgJWluJSBjKDI3LCAzMSwgMzAsIDYsIDM4LCAyOCwgIDE1LCA0OSwgNDcsIDQ2LCA1MCwgNTQpKSB7IAogICAgICBwcmludChzYW1wbGVzW2ldKQogICAgICAjIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgogICAgICB5bGltIDwtIDEwMCAjICJQVF8zN0I1SlJQMSIsICJQVF9DWFQ4MUdSTSIsICJQVF9KU0ZCTUs1ViIsICJQVF9YQTk4SEcxQyIsICJQVF9OOFcyNkgxOSIsICAiUFRfODlYUlpCU0ciLCJQVF85OVM1QlBFMyIsICJQVF84R04zVFFSTSIsICJQVF9IRlFOS1A1WCIsICJQVF9NRFdQUkRCVCIsICAiUFRfOVBKUjBaSzciLCAiUFRfMUgyUkVIVDIiCiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnQoc2FtcGxlc1tpXSkKICAgICAgICAjIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgogICAgICAgIHlsaW0gPC0gNTAKICAgICAgfSAKIAogICMgUnVuIGZ1bmN0aW9uCiAgZm5hbWUgPC0gcGFzdGUwKHBsb3RzX2RpciwgIi8iLCBzYW1wbGVzW2ldLCAiLVRNQi1iYXJwbG90LnBkZiIpCiAgcHJpbnQoZm5hbWUpCiAgcCA8LSBjcmVhdGVfYmFycGxvdF9zYW1wbGUodG1iX2RmID0gdG1iX3N1YiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bGltID0geWxpbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWQgPSBzYW1wbGVzW2ldKQogIHBkZihmaWxlID0gZm5hbWUsIHdpZHRoID0gNSwgaGVpZ2h0ID0gNCkKICBwcmludChwKQogIGRldi5vZmYoKQp9CmBgYAoKYGBge3IgZWNobz1UUlVFfQpzZXNzaW9uSW5mbygpCmBgYAo=